package org.one.stone.soup.wiki.screen.multicaster.applet;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GraphicsDevice;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.InputStream;
import java.net.Socket;
import javax.swing.ImageIcon;
import javax.swing.JApplet;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import org.one.stone.soup.screen.recorder.ScreenPlayer;
import org.one.stone.soup.screen.recorder.ScreenPlayerListener;
import org.one.stone.soup.stringhelper.StringGenerator;
import org.one.stone.soup.xml.XmlElement;
public class JPlayerApplet extends JApplet implements ScreenPlayerListener,KeyListener{
private ScreenPlayer player;
private ImageIcon icon;
private JLabel screenView;
private JScrollPane scrollPane;
private JFrame fullScreenFrame;
boolean fullScreen = false;
private JLabel text;
private JLabel frameLabel;
private Socket socket;
private int frameCount;
private long startTime;
public JPlayerApplet()
{
System.out.println("Build 1.0");
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(1,2));
panel.setBackground(Color.black);
frameLabel = new JLabel("Frame: 0 Time: 0");
frameLabel.setBackground(Color.black);
frameLabel.setForeground(Color.red);
text=new JLabel("Not Connected");
text.setBackground(Color.black);
text.setForeground(Color.red);
panel.add(text);
panel.add(frameLabel);
this.getContentPane().add( panel,BorderLayout.SOUTH );
this.addKeyListener(this);
}
public void init()
{
String address = getParameter("address");
if(address==null)
{
address=this.getCodeBase().getHost();
}
String port = getParameter("port");
if(port==null)
{
port = "80";
}
String page = getParameter("page");
if(page==null)
{
page = "/OpenForum/ScreenShare/Share";
}
String id = getParameter("id");
if(id==null)
{
id = JOptionPane.showInputDialog(this,"Enter the WebCast ID");
}
if(id==null)
{
return;
}
try{
XmlElement header = new XmlElement("Player");
header.addAttribute("id",id);
header.addChild("alias").addValue( StringGenerator.generateUniqueId() );
System.out.println("Opening "+address+":"+port+" page:"+page);
socket = new Socket(address,80);
socket.getOutputStream().write( ("GET "+page+" HTTP/1.1\r\n").getBytes() );
socket.getOutputStream().write( ("\r\n\r\n").getBytes() );
socket.getOutputStream().write(header.toXml().getBytes());
socket.getOutputStream().flush();
InputStream iStream = socket.getInputStream();
player = new ScreenPlayer(iStream,this);
player.setRealtime(true);
frameCount=0;
player.play();
startTime = System.currentTimeMillis();
text.setText("Connected to "+address+":"+port);
}
catch(Exception e)
{
e.printStackTrace();
return;
}
}
public void playerStopped()
{
text.setText("Not Connected");
player=null;
}
public void showNewImage(Image image)
{
if(icon==null)
{
icon = new ImageIcon(image);
screenView = new JLabel(icon);
scrollPane = new JScrollPane(screenView);
scrollPane.setSize(image.getWidth(this),image.getHeight(this));
this.getContentPane().add(scrollPane,BorderLayout.CENTER);
setVisible(true);
}
else
{
icon.setImage(image);
}
repaint(0);
}
public void newFrame()
{
if(frameCount==0)
{
player.pause();
}
frameCount++;
long time = System.currentTimeMillis()-startTime;
String seconds = ""+time/1000;
String milliseconds = ""+time%1000;
milliseconds = StringGenerator.pad(milliseconds,4,'0')+milliseconds;
frameLabel.setText("Frame:"+frameCount+" Time:"+seconds+"."+milliseconds);
}
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_F11)
{
toggleFullScreen();
}
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
private void toggleFullScreen()
{
GraphicsDevice device = this.getGraphicsConfiguration().getDevice();
if(device.isFullScreenSupported())
{
if(fullScreen==false)
{
scrollPane.remove( screenView );
fullScreenFrame = new JFrame();
fullScreenFrame.setUndecorated(true);
fullScreenFrame.addKeyListener(this);
fullScreenFrame.setLayout( new FlowLayout() );
fullScreenFrame.add( screenView );
device.setFullScreenWindow(fullScreenFrame);
this.setVisible(true);
fullScreen = true;
}
else
{
fullScreenFrame.remove( screenView );
scrollPane.setViewportView( screenView );
device.setFullScreenWindow(null);
fullScreenFrame.dispose();
fullScreenFrame=null;
this.setVisible(true);
fullScreen = false;
}
}
}
}